

/*-------------------------------------------------------------------------
 *
 * geqo.h
 *	  优化器/geqo中各文件的原型
 *
 * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 * src/include/optimizer/geqo.h
 *
 *-------------------------------------------------------------------------
 */

/* 贡献者：
   =*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
   *  Martin Utesch				 * 自动控制研究所		   *
   =							 = 矿业与技术大学 =
   *  utesch@aut.tu-freiberg.de  * 德国弗赖贝格				   *
   =*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
 */

#ifndef GEQO_H
#define GEQO_H

#include "common/pg_prng.h"
#include "nodes/pathnodes.h"
#include "optimizer/geqo_gene.h"


/* GEQO 调试标志 */
/*
 #define GEQO_DEBUG
 */

/* 在此选择一个重组机制 */
/*
 #define ERX
 #define PMX
 #define CX
 #define PX
 #define OX1
 #define OX2
 */
#define ERX


/*
 * 配置选项
 *
 * 如果您更改这些，请更新 backend/utils/misc/postgresql.conf.sample
 */
extern PGDLLIMPORT int Geqo_effort; /* 1 .. 10，用于调整默认值的旋钮 */

#define DEFAULT_GEQO_EFFORT 5
#define MIN_GEQO_EFFORT 1
#define MAX_GEQO_EFFORT 10

extern PGDLLIMPORT int Geqo_pool_size;	/* 2 .. 无穷大，或 0 使用默认值 */

extern PGDLLIMPORT int Geqo_generations;	/* 1 .. 无穷大，或 0 使用默认值 */

extern PGDLLIMPORT double Geqo_selection_bias;

#define DEFAULT_GEQO_SELECTION_BIAS 2.0
#define MIN_GEQO_SELECTION_BIAS 1.5
#define MAX_GEQO_SELECTION_BIAS 2.0

extern PGDLLIMPORT double Geqo_seed;	/* 0 .. 1 */


/*
 * GEQO 运行的私有状态 --- 可以通过 root->join_search_private 访问
 */
typedef struct
{
	List	   *initial_rels;	/* 我们正在连接的基本关系 */
	pg_prng_state random_state; /* PRNG 状态 */
} GeqoPrivateData;


/* geqo_main.c 中的例程 */
extern RelOptInfo *geqo(PlannerInfo *root,
						int number_of_rels, List *initial_rels);

/* geqo_eval.c 中的例程 */
extern Cost geqo_eval(PlannerInfo *root, Gene *tour, int num_gene);
extern RelOptInfo *gimme_tree(PlannerInfo *root, Gene *tour, int num_gene);

#endif							/* GEQO_H */
